Ошибка, которую вы видите, связана с тем, что Prisma ожидает значение типа Int
для поля id
, но вы передаете строку (String
). Это происходит из-за того, что в вашем коде значение id
передается как строка, а не как число.
Причина ошибки
В Prisma, если поле id
в вашей модели определено как Int
, то при вызове метода findUnique
вы должны передавать значение типа number
. Однако в вашем коде вы передаете строку "2"
, что вызывает ошибку.Пример вашей строки кода:
typescript
return this.prisma.documents.findUnique({
where: {
id: "2", // Здесь передается строка вместо числа
},
});
Решение
- Убедитесь, что
id
передается как число: Еслиid
приходит из параметров запроса (например,@Param()
), то он будет строкой по умолчанию. Вам нужно преобразовать его в число перед передачей в Prisma.Исправленный код:typescriptasync getOneDocuments(id: number) { return this.prisma.documents.findUnique({ where: { id: Number(id), // Преобразуем строку в число }, }); }
- Используйте декоратор
@Param
с преобразованием: Если вы используете@Param()
в контроллере, убедитесь, что значение параметра преобразуется в число. Для этого можно использовать встроенныйParseIntPipe
от NestJS.Пример контроллера:typescriptimport { Controller, Get, Param, ParseIntPipe } from '@nestjs/common'; import { DocumentsService } from './documents.service'; @Controller('documents') export class DocumentsController { constructor(private readonly documentsService: DocumentsService) {} @Get(':id') async getOneDocument(@Param('id', ParseIntPipe) id: number) { return this.documentsService.getOneDocuments(id); } }
ЗдесьParseIntPipe
автоматически преобразует строку в число перед передачей в метод. - Проверьте модель Prisma: Убедитесь, что поле
id
в вашей модели Prisma действительно имеет типInt
. Откройте файлschema.prisma
и проверьте определение моделиdocuments
:prismamodel documents { id Int @id @default(autoincrement()) title String documentDate DateTime // другие поля... }
Если полеid
имеет типString
, то ошибка вызвана несоответствием типов. В таком случае либо измените типid
наInt
, либо передавайте строку в запросе. - Проверка данных в запросе: Если вы передаете
id
из тела запроса или параметров, убедитесь, что оно корректно преобразуется в число.
Итоговый код
Сервис (documents.service.ts
):
typescript
import { Injectable } from '@nestjs/common';
import { PrismaService } from '../prisma/prisma.service';
@Injectable()
export class DocumentsService {
constructor(private prisma: PrismaService) {}
async getOneDocuments(id: number) {
return this.prisma.documents.findUnique({
where: {
id: Number(id), // Преобразуем строку в число
},
});
}
}
Контроллер (documents.controller.ts
):
typescript
import { Controller, Get, Param, ParseIntPipe } from '@nestjs/common';
import { DocumentsService } from './documents.service';
@Controller('documents')
export class DocumentsController {
constructor(private readonly documentsService: DocumentsService) {}
@Get(':id')
async getOneDocument(@Param('id', ParseIntPipe) id: number) {
return this.documentsService.getOneDocuments(id);
}
}
Проверка
- Запустите приложение:bash
npm run start
- Выполните запрос:bash
GET http://localhost:3000/documents/2
Если документ сid = 2
существует, вы получите его данные. Если нет, Prisma вернетnull
.
Дополнительные рекомендации
- Если вы используете Swagger, добавьте описание параметра
id
в контроллере:typescriptimport { ApiParam } from '@nestjs/swagger'; @ApiParam({ name: 'id', type: Number, description: 'ID документа' }) @Get(':id') async getOneDocument(@Param('id', ParseIntPipe) id: number) { return this.documentsService.getOneDocuments(id); }
- Если вы хотите обработать случай, когда документ не найден, добавьте проверку:typescript
async getOneDocuments(id: number) { const document = await this.prisma.documents.findUnique({ where: { id: Number(id) }, }); if (!document) { throw new NotFoundException(`Document with ID ${id} not found`); } return document; }
Теперь ваш код будет корректно работать с параметром id
и обрабатывать ошибки. 😊